package com.jeegod.core.constants;

import com.jeegod.core.base.BaseEnum;

import java.util.HashMap;
import java.util.Map;

/**
 * 请求返回码的枚举类型
 *
 * @author 龚小龙
 * @version 1.0-20181215
 */
public enum BaseResultEnums implements BaseEnum<String, String> {

    /**
     * 枚举值：请求成功
     */
    SUCCESS("request.success", "请求成功"),

    /**
     * 枚举值：请求失败
     */
    FAILURE("request.failure", "请求失败"),

    /**
     * 枚举值：操作成功
     */
    OPERATION_SUCCESS("operation.success", "操作成功"),

    /**
     * 枚举值：操作失败
     */
    OPERATION_FAILURE("operation.failure", "操作失败"),

    /**
     * 枚举值：系统异常
     */
    ERROR("system.error", "系统异常"),

    /**
     * 枚举值：请求资源不存在
     */
    NOT_FOUND("not_found", "请求资源不存在"),

    /**
     * 枚举值：无权限访问
     */
    FORBIDDEN("forbidden", "无权限访问"),

    /**
     * 枚举值：记录版本不存在或不匹配
     */
    VERSION_NOT_MATCH("record_not_exists_or_version_not_match", "记录版本不存在或不匹配"),

    /**
     * 枚举值：参数不能为空
     */
    PARAMATER_NOT_NULL("paramater_not_be_null", "参数不能为空"),

    /**
     * 枚举值：更新失败
     */
    UPDATE_FAILED("update_failed", "更新失败");

    /**
     * 成员变量：编码
     */
    private String code;

    /**
     * 成员变量：描述
     */
    private String desc;

    /**
     * 私有静态Map对象，存放所有枚举的编码（key）和描述（value)
     */
    private static Map<String, String> allMap = new HashMap<String, String>();

    /**
     * 构造函数：枚举唯一的构造函数
     *
     * @param code 编码
     * @param desc 描述
     */
    private BaseResultEnums(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    /**
     * 静态代码块：将所有枚举存放到allMap中
     */
    static {
        for (BaseResultEnums enums : BaseResultEnums.values()) {
            allMap.put(enums.code, enums.desc);
        }
    }

    /**
     * 获取：编码（实现接口中的方法）
     *
     * @return 编码
     */
    public String code() {
        return this.code;
    }

    /**
     * 获取：描述（实现接口中的方法）
     *
     * @return 描述
     */
    public String desc() {
        return this.desc;
    }

    /**
     * 获取：根据编码获得描述
     *
     * @param code 编码
     * @return 描述
     */
    public String desc(String code) {
        return allMap.get(code);
    }
}
